配置 WSL
使用 ssh 远程 wsl
安装 ssh 服务
apt install openssh-server
修改 sshd 服务启动配置文件
vi /etc/ssh/sshd_config
# add
# 允许root用户登录
PermitRootLogin yes
# 服务端口,为了不和windows及其它wsl子系统冲突,手动指定一个
Port 12308
# 监听地址,如果需要远程机器连接
ListenAddress 0.0.0.0
启动
ubuntu
service ssh restart
wsl
wsl 是无法用 systemctl
启动 ssh 的,因此,需要自己写脚本 vi /etc/init.d/sshd
#!/bin/sh
# Start/stop/restart the secure shell server:
sshd_start() {
# Create host keys if needed.
if [ ! -r /etc/ssh/ssh_host_key ]; then
/usr/bin/ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key -N ''
fi
if [ ! -f /etc/ssh/ssh_host_dsa_key ]; then
/usr/bin/ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
fi
if [ ! -f /etc/ssh/ssh_host_rsa_key ]; then
/usr/bin/ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
fi
if [ ! -f /etc/ssh/ssh_host_rsa_key ]; then
/usr/bin/ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key-N ''
fi
if [ ! -f /etc/ssh/ssh_host_rsa_key ]; then
/usr/bin/ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key-N ''
fi
/usr/sbin/sshd -f /etc/ssh/sshd_config
}
sshd_stop() {
killall sshd
}
sshd_restart() {
if [ -r /var/run/sshd.pid ]; then
echo "WARNING: killing listener process only. To kill every sshd process, you must"
echo " use 'rc.sshd stop'. 'rc.sshd restart' kills only the parent sshd to"
echo " allow an admin logged in through sshd to use 'rc.sshd restart' without"
echo " being cut off. If sshd has been upgraded, new connections will now"
echo " use the new version, which should be a safe enough approach."
kill `cat /var/run/sshd.pid`
else
killall sshd
fi
sleep 1
sshd_start
}
case "$1" in
'start')
sshd_start
;;
'stop')
sshd_stop
;;
'restart')
sshd_restart
;;
*)
echo "usage $0 start|stop|restart"
esac
启动
bash /etc/init.d/sshd start
查看
ps -ef|grep ssh
windows 下面 win+r
打开 cmd
,输 入 netstat -ano|findstr "12308"
查看端口,发现已经启动
到这个阶段,已经可以用本地 win 主机来 ssh 连接 wsl 了
ssh <name>@<wsl ip> -p 12308
远程 ssh 连接
如果防火墙开启,那我们需要配置防火墙规则同时需要配置端口转发规则
配置端口转发规则
意思就是,访问到物理机的 2222 端口的请求,转发到 wsl 的 12308 端口,IP 为 wsl 的 ip
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=[IP] connectport=[PORT]
配置防火墙出入站规则
这是安全规则,如果防火墙关闭的话则不用配置,
netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=2222
配置完以上两步后,我们则可以通过外网来访问我们的 wsl
(例如,本机 ip 是 1.2.3.4,wsl 地址是 172.16.12.1)
那么,远程访问时,通过
ssh jack@1.2.3.4 -p 2222
即使所有的命令行都关闭,只要 wsl 不是 shutdown 状态,ssh 服务正常开启,那么就可以通过 ssh 进行连接
其实,通过这一步可以自由的配置本地端口与 wsl 端口的映射,也就是可以通过物理机来进行网站或应用程序的访问,比如,我们再 wsl 部署一个网站,我们可以直接将该网站的端口 xxxx 映射到物理机的 8080(举例),那么我们通过本机 ip:8080 即可访问该网站,大大提高我们的易操作性。
wsl “固定 IP” 配置
wsl 每次重启,ip 地址都会变化,也就是说通过以上步骤添加的映射规则再 wsl 重启后就失效了!
其实这种说法并不准确,因为严格意义上,固定 wsl ip 实现相当复杂,我们一般都是通过变相的操作来达到相同的目的。
这个方法就是,wsl 启动时,读取 ip 并将 ip 以及域名写入到 Windows 的 hosts 文件中,这样以来,我们映射规则中的 IP 就可以用域名来代替。
公网访问
本地机设置
设置镜像模式
docker-compose.yml
version: '3.9'
services:
frpc:
image: snowdreamtech/frpc:0.52.3
container_name: frpc
restart: always
network_mode: host
volumes:
- /etc/localtime:/etc/localtime:ro
- ~/.opt/frpc.toml:/etc/frp/frpc.toml
frpc.toml
# 连接配置
## 连接服务端的地址
serverAddr = "X.X.X.X"
## 连接服务端的端口
serverPort = 7000
# 鉴权配置
## 鉴权方式
auth.method = "token"
## Token
auth.token = "123456"
# 代理配置
## TCP 连接
[[proxies]]
### 连接名称
name = "ss"
### 连接类型
type = "tcp"
### 本地IP
localIP = "host.docker.internal"
### 本地端口
localPort = 22
### 是否启用加密功能,启用后该代理和服务端之间的通信内容都会被加密传输
transport.useEncryption = true
### 是否启用压缩功能,启用后该代理和服务端之间的通信内容都会被压缩传输
transport.useCompression = false
### 服务端绑定的端口,用户访问服务端此端口的流量会被转发到对应的本地服务
remotePort = 2022
## HTTP 连接
[[proxies]]
### 连接名称
name = "web-demo"
### 连接类型
type = "http"
### 本地IP
localIP = "host.docker.internal"
### 本地端口
localPort = 80
### 子域名列表,用户访问服务端此域名的流量会被转发到对应的本地服务
customDomains = ["demo.hty1024.com"]
### 是否启用加密功能,启用后该代理和服务端之间的通信内容都会被加密传输
transport.useEncryption = true
### 是否启用压缩功能,启用后该代理和服务端之间的通信内容都会被压缩传输
transport.useCompression = fals
中转服务器设置 frp
docker-compose.yml
version: "3.9"
services:
frps:
image: snowdreamtech/frps:0.52.3
container_name: frps
hostname: frps
restart: always
network_mode: host
volumes:
- /etc/localtime:/etc/localtime:ro
- ~/.opt/frps.toml:/etc/frp/frps.toml:ro
frps.toml
# 监听地址
bindAddr = "0.0.0.0"
# 监听端口
bindPort = 7000
# 监听 KCP 协议端口
kcpBindPort = 7000
# 监听 HTTP 协议端口
vhostHTTPPort = 80
# 监听 HTTPS 协议端口
vhostHTTPSPort = 443
# 允许代理绑定的服务端端口
allowPorts = [
{ single = 6251 }
]
# 鉴权配置
## 鉴权方式
auth.method = "token"
## Token
auth.token = "123456"
# 仪表盘配置
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "1234
转移 WSL 到其他盘
准备工作
打开 CMD,输入 wsl -l -v
查看 wsl 虚拟机的名称与状态。
了解到本机的 WSL 全称为 Ubuntu,以下的操作都将围绕这个来进行。
输入 wsl --shutdown
使其停止运行,再次使用 wsl -l -v
确保其处于 stopped 状态。
导出 / 恢复备份
在 D 盘创建一个目录用来存放新的 WSL,比如 D:\Ubuntu_WSL
。
导出备份(比如命名为 Ubuntu.tar)
wsl --export Ubuntu D:\Ubuntu_WSL\Ubuntu.tar
确定在此目录下可以看见备份 Ubuntu.tar 文件之后,注销原有的 wsl
wsl --unregister Ubuntu
将备份文件恢复到 D:\Ubuntu_WSL
中去
wsl --import Ubuntu D:\Ubuntu_WSL D:\Ubuntu_WSL\Ubuntu.tar
这时候启动 WSL,发现好像已经恢复正常了,但是用户变成了 root,之前使用过的文件也看不见了。